/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package controladoras.apresentacao;
import interfaces.IGerenciaVoo;
import telas.TelaGerenciaVoo;
import telas.TelaConsultaVoo;
import controladoras.apresentacao.modelos.ModeloTabelaGerenciaVoo;
import controladoras.apresentacao.modelos.ModeloTabelaConsultaVoo;
import java.util.ArrayList;
import entidades.Voo;
import entidades.Aeroporto;
import entidades.Cidade;
import erros.ErroAtualizacao;
import javax.swing.JOptionPane;
import tipos.Data;
/**
 * Classe que implementa a controladora de interação de voo.
 * @author thiagostuckert
 */
public class CntrIntVoo {
    /**
     * Variavel de referencia para o objeto
     * singleton a ser criado.
     */
    private static CntrIntVoo ref;
    /**
     * Atributo utilizado para a chamada dos metodos definidos na interface
     * de gerencia de voo.
     */
    private IGerenciaVoo cntrGerenciaVoo;
    /**
     * Atributo utilizado para a chamada dos metodos definidos na tela
     * de gerencia de voo.
     */
    private TelaGerenciaVoo telaGerenciaVoo;
    /**
     * Atributo utilizado para a chamada dos metodos definidos na tela
     * de consulta de voo.
     */
    private TelaConsultaVoo telaConsultaVoo;
    /**
     * Atributo utilizado para a chamada dos metodos definidos no modelo
     * da tabela de gerencia de voo.
     */
    private ModeloTabelaGerenciaVoo modeloTabelaGerenciaVoo;
    /**
     * Atributo utilizado para a chamada dos metodos definidos no modelo
     * da tabela de consulta de voo.
     */
    private ModeloTabelaConsultaVoo modeloTabelaConsultaVoo;
    /**
     * Atributo utilizado para a edição de reservas.
     */
    private ArrayList<Voo> listaVoos = new ArrayList();
    /**
     * Atributo utilizado para recuperar todas as reservas do cliente.
     */
    private ArrayList<Voo> voosParam = new ArrayList();

    /**
     * Metodo que atribui uma controladora a outra.
     * @param cntrGerenciaVooParam controladora a ser atribuida.
     */
    public final void setCntrCadastroVoo(final IGerenciaVoo
            cntrGerenciaVooParam) {
        this.cntrGerenciaVoo = cntrGerenciaVooParam;
    }

    /**
     * Metodo que instancia a contraladora de interação de voo.
     * @return Controladora de interação de voo instanciada
     */
    public static CntrIntVoo instanciar() {
        if (ref == null) {
            ref = new CntrIntVoo();
        }
        return ref;
    }
    /**
     * Metodo que fecha a tela de gerencia de voo.
     */
    public final void encerrarGerenciaVoo() {
        telaGerenciaVoo.setVisible(false);
    }

    /**
     * Metodo que fecha a tela de consulta de voo.
     */
    public final void encerrarConsultaVoo() {
        telaConsultaVoo.setVisible(false);
    }
     /**
     * Inicia a execução através da tela de gerência de voo e inicializa
     * sua controladora de tela.
     */
    public final void mostrarTelaGerenciaVoo() {
        try {
           telaGerenciaVoo = TelaGerenciaVoo.instanciar();
           telaGerenciaVoo.setControladoraInteracao(this);
           modeloTabelaGerenciaVoo = ModeloTabelaGerenciaVoo.instanciar();
           voosParam = cntrGerenciaVoo.recuperarVoos();
           copiaLista();
           modeloTabelaGerenciaVoo.setRows(voosParam);
           telaGerenciaVoo.setVisible(true);
        } catch (Exception e) {
                JOptionPane.showMessageDialog(telaGerenciaVoo,
                     e.getMessage());
        }
    }

    /**
     * Inicia a execução através da tela de consulta de voo e inicializa
     * sua controladora de tela.
     */
    public final void mostrarTelaConsultaVoo() {
        try {
            telaConsultaVoo = TelaConsultaVoo.instanciar();
            telaConsultaVoo.setControladoraInteracao(this);
            modeloTabelaConsultaVoo = ModeloTabelaConsultaVoo.instanciar();
            voosParam = cntrGerenciaVoo.recuperarVoos();
            copiaLista();
            modeloTabelaConsultaVoo.setRows(voosParam);
            telaConsultaVoo.setFrameVisible(true);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(telaGerenciaVoo,
                    e.getMessage());
        }
    }

    /**
     * Metodo que copia o conteudo de um ArrayList para outro.
     */
    public final void copiaLista() {
        listaVoos.clear();
        for (int i = 0; i < voosParam.size(); i++) {
            Voo vooCopia = voosParam.get(i);
            Voo voo = new Voo(vooCopia.getNumeroVoo(),
                                vooCopia.getDataPartida(),
                                vooCopia.getDataChegada(),
                                vooCopia.getHorarioPartida(),
                                vooCopia.getHorarioChegada(),
                                vooCopia.getAeroportoPartida(),
                                vooCopia.getAeroportoChegada(),
                                vooCopia.getCidadeOrigem(),
                                vooCopia.getCidadeDestino(),
                                vooCopia.getVagas());
            listaVoos.add(voo);
        }
    }

    /**
     * Metodo que chama a controladora de negócio para a adição de reserva.
     * @param numeroVooParam Numero do voo a ser adicionado.
     * @param dataPartidaParam Data de partida do voo a ser adicionado.
     * @param dataChegadaParam Data de chegada do voo a ser adicionado.
     * @param horarioPartidaParam Horario de partida do voo a ser adicionado.
     * @param horarioChegadaParam Horario de chegada do voo a ser adicionado.
     * @param aeroportoPartidaParam Aeroporto de partida do voo
     * a ser adicionado.
     * @param aeroportoChegadaParam Aeroporto de chegada do voo
     * a ser adicionado.
     * @param cidadeOrigemParam Cidade de Origem do voo a ser adicionado.
     * @param cidadeDestinoParam Cidade de Destino do voo a ser adicionado.
     * @param vagas Numero de vagas do voo a ser adicionado.
     */
    public final void addVoo(final String numeroVooParam,
            final String dataPartidaParam,
            final String dataChegadaParam, final String horarioPartidaParam,
            final String horarioChegadaParam,
            final String aeroportoPartidaParam,
            final String aeroportoChegadaParam,
            final String cidadeOrigemParam,
            final String cidadeDestinoParam, final int vagas) {

        modeloTabelaGerenciaVoo = ModeloTabelaGerenciaVoo.instanciar();
        try {
            Aeroporto aeroportoPartida = new Aeroporto(aeroportoPartidaParam);
            Aeroporto aeroportoChegada = new Aeroporto(aeroportoChegadaParam);
            Cidade cidadeOrigem = new Cidade(cidadeOrigemParam);
            Cidade cidadeDestino = new Cidade(cidadeDestinoParam);

            Voo voo = new Voo(numeroVooParam, dataPartidaParam,
                dataChegadaParam, horarioPartidaParam,
                horarioChegadaParam, aeroportoPartida, aeroportoChegada,
                cidadeOrigem, cidadeDestino, vagas);

            cntrGerenciaVoo.cadastrarVoo(voo);
            modeloTabelaGerenciaVoo.addRow(voo);
            JOptionPane.showMessageDialog(telaGerenciaVoo,
                     "Voo Cadastrado com sucesso");
        } catch (Exception e) {
            JOptionPane.showMessageDialog(telaGerenciaVoo,
                     e.getMessage());
        }
    }

    /**
     * Método que chama a controladora de negócio para a remoção de voo.
     * @param linha linha da tabela onde está o voo a ser removido.
     */
    public final void delVoo(final int linha) {
        modeloTabelaGerenciaVoo = ModeloTabelaGerenciaVoo.instanciar();
        try {

            Voo voo = new Voo((String) modeloTabelaGerenciaVoo
                    .getValueAt(linha, 0),
                              (String) modeloTabelaGerenciaVoo
                               .getValueAt(linha, 1),
                              (String) modeloTabelaGerenciaVoo
                              .getValueAt(linha, 2),
                              (String) modeloTabelaGerenciaVoo
                              .getValueAt(linha, 3),
                              (String) modeloTabelaGerenciaVoo
                              .getValueAt(linha, 4),
                              new Aeroporto((String) modeloTabelaGerenciaVoo
                              .getValueAt(linha, 5)),
                              new Aeroporto((String) modeloTabelaGerenciaVoo
                              .getValueAt(linha, 6)),
                              new Cidade((String) modeloTabelaGerenciaVoo
                              .getValueAt(linha, 7)),
                              new Cidade((String) modeloTabelaGerenciaVoo
                              .getValueAt(linha, 8)),
                              Integer.parseInt((String) modeloTabelaGerenciaVoo
                              .getValueAt(linha, 9))
                              );

            cntrGerenciaVoo.deletarVoo(voo);
            modeloTabelaGerenciaVoo.delRow(linha);
            JOptionPane.showMessageDialog(telaGerenciaVoo,
                     "Voo deletada com sucesso");
        } catch (Exception e) {
            JOptionPane.showMessageDialog(telaGerenciaVoo,
                     e.getMessage());
        }
    }

    /**
     * Metodo que chama a controladora de negocio para atualização de voo.
     * @param vooVelho Voo a ter seus dados atualizados.
     * @param vooNovo Voo com os novos dados.
     * @throws erro é tratado na tabela.
     */
    public final void upVoo(final Voo vooVelho, final Voo vooNovo)
            throws ErroAtualizacao{
        cntrGerenciaVoo.atualizarVoo(vooVelho, vooNovo);
        JOptionPane.showMessageDialog(telaGerenciaVoo,
                     "Voo alterado com sucesso");
    }

    /**
     * @param nomeCidadeOrigem Nome da cidade de origem do voo a ser consultado.
     * @param nomeCidadeDestino Nome da cidade de destino do voo
     * a ser consultado.
     * @param dataVoo Data de partida do voo a ser consultado.
     */
    public final void selVoo(final String nomeCidadeOrigem, final String
            nomeCidadeDestino, final String dataVoo) {
        modeloTabelaConsultaVoo = ModeloTabelaConsultaVoo.instanciar();
        ArrayList<Voo> listaVoos2 = new ArrayList();
       try {
           Cidade cidadeOrigem = new Cidade(nomeCidadeOrigem);
           Cidade cidadeDestino = new Cidade(nomeCidadeDestino);
           Data.validar(dataVoo);

           listaVoos2 = cntrGerenciaVoo.recuperarVoos(cidadeOrigem,
                   cidadeDestino, dataVoo);

            modeloTabelaConsultaVoo.setRows(listaVoos2);
            JOptionPane.showMessageDialog(telaConsultaVoo,
                     "Voo consultado com sucesso");
       } catch (Exception e) {
            JOptionPane.showMessageDialog(telaConsultaVoo,
                     e.getMessage());
       }
       return;
    }
}
